home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / dev / mui / mui37_de.lha / Amiga-E / Examples / Layout.e < prev    next >
Text File  |  1996-08-25  |  7KB  |  227 lines

  1. /*
  2. **  Original C Code written by Stefan Stuntz
  3. **
  4. **  Translation into E by Klaus Becker
  5. **
  6. **  All comments are from the C-Source
  7. */
  8.  
  9.  
  10. OPT PREPROCESS
  11.  
  12. MODULE 'tools/installhook'
  13. MODULE 'muimaster','libraries/mui','libraries/muip',
  14.        'mui/muicustomclass','amigalib/boopsi',
  15.        'intuition/classes','intuition/classusr',
  16.        'intuition/screens','intuition/intuition',
  17.        'utility/hooks','utility/tagitem','utility',
  18.        'exec/lists'
  19.  
  20.  
  21. CONST ID_REWARD = 1
  22. DEF lastnum =-1
  23.  
  24. /*
  25. ** Custom layout function.
  26. ** Perform several actions according to the messages lm_Type
  27. ** field. Note that you must return MUILM_UNKNOWN if you do
  28. ** not implement a specific lm_Type.
  29. */
  30.  
  31. PROC layoutFunc(h:PTR TO hook,obj:PTR TO object,lm:PTR TO mui_layoutmsg)
  32.   DEF type,cstate:PTR TO object,child:PTR TO object,maxminwidth=0,maxminheight=0,
  33.       mw,mh,l,t
  34.   type:=lm.lm_type
  35.   SELECT type
  36.     CASE MUILM_MINMAX
  37.       /*
  38.       ** MinMax calculation function. When this is called,
  39.       ** the children of your group have already been asked
  40.       ** about their min/max dimension so you can use their
  41.       ** dimensions to calculate yours.
  42.       **
  43.       ** In this example, we make our minimum size twice as
  44.       ** big as the biggest child in our group.
  45.       */
  46.  
  47.       cstate := lm.lm_children.head
  48.  
  49.       /* find out biggest widths & heights of our children */
  50.  
  51.       WHILE (child := NextObject({cstate}))
  52.         IF ( (maxminwidth <MUI_MAXMAX) AND (_minwidth(child) > maxminwidth)) THEN maxminwidth  := _minwidth(child)
  53.         IF ( (maxminheight<MUI_MAXMAX) AND (_minheight(child) > maxminheight)) THEN maxminheight := _minheight(child)
  54.       ENDWHILE
  55.  
  56.       /* set the result fields in the message */
  57.  
  58.       lm.lm_minmax.minwidth  := 2*maxminwidth
  59.       lm.lm_minmax.minheight := 2*maxminheight
  60.       lm.lm_minmax.defwidth  := 4*maxminwidth
  61.       lm.lm_minmax.defheight := 4*maxminheight
  62.       lm.lm_minmax.maxwidth  := MUI_MAXMAX
  63.       lm.lm_minmax.maxheight := MUI_MAXMAX
  64.  
  65.       RETURN (0)
  66.  
  67.     CASE MUILM_LAYOUT
  68.       /*
  69.       ** Layout function. Here, we have to call MUI_Layout() for each
  70.       ** our children. MUI wants us to place them in a rectangle
  71.       ** defined by (0,0,lm->lm_Layout.Width-1,lm->lm_Layout.Height-1)
  72.       ** You are free to put the children anywhere in this rectangle.
  73.       **
  74.       ** If you are a virtual group, you may also extend
  75.       ** the given dimensions and place your children anywhere. Be sure
  76.       ** to return the dimensions you need in lm->lm_Layout.Width and
  77.       ** lm->lm_Layout.Height in this case.
  78.       **
  79.       ** Return TRUE if everything went ok, FALSE on error.
  80.       ** Note: Errors during layout are not easy to handle for MUI.
  81.       **       Better avoid them!
  82.       */
  83.  
  84.       cstate := lm.lm_children.head
  85.  
  86.       WHILE (child := NextObject({cstate}))
  87.         mw := _minwidth (child)
  88.         mh := _minheight(child)
  89.         l  := Rnd(lm.lm_layout.width - mw)
  90.         t  := Rnd(lm.lm_layout.height - mh)
  91.  
  92.         IF (Mui_Layout(child,l,t,mw,mh,0))=NIL THEN
  93.           RETURN (FALSE)
  94.       ENDWHILE
  95.  
  96.       RETURN (MUI_TRUE)
  97.   ENDSELECT
  98. ENDPROC (MUILM_UNKNOWN)
  99.  
  100.  
  101. PROC pressFunc(app:PTR TO object,num:PTR TO LONG)
  102.  lastnum++
  103.  IF (lastnum<>num[])
  104.    DisplayBeep(0)
  105.    lastnum := -1
  106.  ELSEIF (lastnum=7)
  107.    doMethodA(app,[MUIM_Application_ReturnID,ID_REWARD])
  108.    lastnum := -1
  109.  ENDIF
  110. ENDPROC
  111.  
  112. PROC main() HANDLE
  113.   DEF app,window,signals,running=TRUE,i,result
  114.   DEF b[8]:ARRAY OF LONG,yeah,b0,b1,b2,b3,b4,b5,b6,b7
  115.   DEF layoutHook:hook
  116.   DEF pressHook:hook
  117.  
  118.   installhook(layoutHook,{layoutFunc})
  119.   installhook(pressHook,{pressFunc})
  120.  
  121.   IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN))=NIL THEN
  122.     Raise('Failed to open muimaster.library')
  123.  
  124.   randomize() -> I use a randomize-routine by (C) Martin F. Combs
  125.  
  126.   app := ApplicationObject,
  127.     MUIA_Application_Title      , 'Layout',
  128.     MUIA_Application_Version    , '$VER: Layout 13.56 (30.01.96)',
  129.     MUIA_Application_Copyright  , '©1993, Stefan Stuntz',
  130.     MUIA_Application_Author     , 'Stefan Stuntz & Klaus Becker',
  131.     MUIA_Application_Description, 'Demonstrate custom layout hooks.',
  132.     MUIA_Application_Base       , 'Layout',
  133.     SubWindow, window := WindowObject,
  134.       MUIA_Window_Title, 'Custom Layout',
  135.       MUIA_Window_ID   , "CLS3",
  136.       WindowContents, VGroup,
  137.         Child, TextObject,
  138.           TextFrame,
  139.           MUIA_Background, MUII_TextBack,
  140.           MUIA_Text_Contents, '\ecDemonstration of a custom layout hook.\nSince it\as usually no good idea to have overlapping\nobjects, your hooks should be more sophisticated.',
  141.         End,
  142.         Child, VGroup,
  143.           GroupFrame,
  144.           MUIA_Group_LayoutHook,layoutHook,
  145.           Child, b0 := SimpleButton('Click'),
  146.           Child, b1 := SimpleButton('me'),
  147.           Child, b2 := SimpleButton('in'),
  148.           Child, b3 := SimpleButton('correct'),
  149.           Child, b4 := SimpleButton('sequence'),
  150.           Child, b5 := SimpleButton('to'),
  151.           Child, b6 := SimpleButton('be'),
  152.           Child, b7 := SimpleButton('rewarded!'),
  153.           Child, yeah := SimpleButton('Yeah!\nYou did it!\nClick to quit!'),
  154.         End,
  155.       End,
  156.     End,
  157.   End
  158.  
  159.   IF (app=NIL) THEN
  160.     Raise('Failed to create Application.')
  161.  
  162.   doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  163.     app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  164.  
  165.   doMethodA(yeah,[MUIM_Notify,MUIA_Pressed,FALSE,
  166.     app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  167.   b[0]:=b0
  168.   b[1]:=b1
  169.   b[2]:=b2
  170.   b[3]:=b3
  171.   b[4]:=b4
  172.   b[5]:=b5
  173.   b[6]:=b6
  174.   b[7]:=b7
  175.  
  176.   FOR i:=0 TO 7
  177.     doMethodA(b[i],[MUIM_Notify,MUIA_Pressed,FALSE,
  178.       app,3,MUIM_CallHook,pressHook,i])
  179.   ENDFOR
  180.   set(yeah,MUIA_ShowMe,FALSE)
  181.  
  182.  
  183. /*
  184. ** Input loop...
  185. */
  186.  
  187.   set(window,MUIA_Window_Open,MUI_TRUE)
  188.  
  189.   WHILE (running)
  190.     result:=doMethodA(app,[MUIM_Application_Input,{signals}])
  191.     SELECT result
  192.       CASE MUIV_Application_ReturnID_Quit
  193.         running := FALSE
  194.       CASE ID_REWARD
  195.         set(yeah,MUIA_ShowMe,MUI_TRUE)
  196.     ENDSELECT
  197.     IF (running AND signals) THEN Wait(signals)
  198.   ENDWHILE
  199.  
  200.   set(window,MUIA_Window_Open,FALSE)
  201.  
  202. /*
  203. ** Shut down...
  204. */
  205.  
  206. EXCEPT DO
  207.   IF app THEN Mui_DisposeObject(app)    /* dispose all objects. */
  208.   IF muimasterbase THEN CloseLibrary(muimasterbase)
  209.   IF exception THEN WriteF('\s\n',exception)
  210. ENDPROC
  211.  
  212. /*
  213. **  randomize
  214. **      by
  215. **  Martin F. Combs
  216. **
  217. */
  218.  
  219. PROC randomize()
  220. DEF i, currentsecs, currentmicros, seed
  221.   CurrentTime({currentsecs},{currentmicros})
  222.   seed:=-currentmicros
  223.   FOR i:=0 TO currentsecs AND $FF DO seed:=RndQ(seed)
  224.   IF seed<0 THEN Rnd(seed) ELSE Rnd(-seed)
  225. ENDPROC seed
  226.  
  227.